From 5e7cc92fbcd00815254a1a7e4406580e7052196c Mon Sep 17 00:00:00 2001 From: robertl Date: Tue, 5 Nov 2002 06:08:51 +0000 Subject: [PATCH] Add target-specific init options to all file formats. Add 'baud' option to magproto. --- README | 3 +++ cetus.c | 4 ++-- csv.c | 8 ++++---- defs.h | 6 +++--- dna.c | 4 ++-- garmin.c | 2 +- geo.c | 4 ++-- gpsman.c | 4 ++-- gpspilot.c | 4 ++-- gpsutil.c | 4 ++-- gpx.c | 4 ++-- holux.c | 4 ++-- magnav.c | 4 ++-- magproto.c | 46 +++++++++++++++++++++++++++++++++++++++------- main.c | 10 ++++++---- mapsend.c | 4 ++-- mapsource.c | 4 ++-- mxf.c | 4 ++-- ozi.c | 4 ++-- pcx.c | 4 ++-- psp.c | 4 ++-- tiger.c | 4 ++-- tpg.c | 4 ++-- vecs.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 24 files changed, 140 insertions(+), 55 deletions(-) diff --git a/README b/README index 68d86a1d9..1fc27f08e 100644 --- a/README +++ b/README @@ -58,6 +58,9 @@ THE FORMATS program. Communication errors are handled and verification of data is turned on. + Additional options: + baud: may be 1200, 2400, 4800, 9600, 19200, but must match receiver. + GARMIN Waypoint serial upload and download works reliably under both diff --git a/cetus.c b/cetus.c index c6b2fe638..64a94dab1 100644 --- a/cetus.c +++ b/cetus.c @@ -60,7 +60,7 @@ struct pdb *opdb; struct pdb_record *opdb_rec; static void -rd_init(const char *fname) +rd_init(const char *fname, const char *args) { file_in = fopen(fname, "rb"); if (file_in == NULL) { @@ -75,7 +75,7 @@ rd_deinit(void) } static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { file_out = fopen(fname, "wb"); out_fname = fname; diff --git a/csv.c b/csv.c index 495011039..e3d9cc019 100644 --- a/csv.c +++ b/csv.c @@ -30,7 +30,7 @@ static FILE *file_out; #define MYNAME "CSV" static void -rd_init(const char *fname) +rd_init(const char *fname, const char *args) { file_in = fopen(fname, "r"); if (file_in == NULL) { @@ -45,7 +45,7 @@ rd_deinit(void) } static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { file_out = fopen(fname, "w"); if (file_out == NULL) { @@ -54,9 +54,9 @@ wr_init(const char *fname) } static void -xmap_wr_init(const char *fname) +xmap_wr_init(const char *fname, const char *args) { - wr_init(fname); + wr_init(fname, args); fprintf(file_out, "BEGIN SYMBOL\n"); } diff --git a/defs.h b/defs.h index 6c8629a0e..20e020dc5 100644 --- a/defs.h +++ b/defs.h @@ -78,7 +78,6 @@ typedef struct { extern global_options global_opts; - /* * Extended data if waypoint happens to represent a geocache. This is * totally voluntary data... @@ -144,10 +143,11 @@ typedef struct { int rte_num; } route_head; -typedef void (*ff_init) (char const *); +typedef void (*ff_init) (char const *, char const *); typedef void (*ff_deinit) (void); typedef void (*ff_read) (void); typedef void (*ff_write) (void); +char * get_option(const char *iarglist, const char *argname); void fprintdms(FILE *, const coord *, int); @@ -188,7 +188,7 @@ void fatal(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2))); #endif ; -ff_vecs_t *find_vec(char *); +ff_vecs_t *find_vec(char *, char **); void disp_vecs(void); void printposn(const coord *c, int is_lat); diff --git a/dna.c b/dna.c index 10b0c699e..54eb791be 100644 --- a/dna.c +++ b/dna.c @@ -32,7 +32,7 @@ static FILE *file_out; #define MYNAME "DNA" static void -rd_init(const char *fname) +rd_init(const char *fname, const char *args) { file_in = fopen(fname, "r"); if (file_in == NULL) { @@ -47,7 +47,7 @@ rd_deinit(void) } static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { file_out = fopen(fname, "w"); if (file_out == NULL) { diff --git a/garmin.c b/garmin.c index b1df22a37..0ca73c40e 100644 --- a/garmin.c +++ b/garmin.c @@ -27,7 +27,7 @@ static const char *portname; static void -rw_init(const char *fname) +rw_init(const char *fname, const char *opts) { if (GPS_Init(fname) < 0) { fatal(MYNAME ":Can't init %s\n", fname); diff --git a/geo.c b/geo.c index fe2467b8c..5662cc24f 100644 --- a/geo.c +++ b/geo.c @@ -141,7 +141,7 @@ geo_cdata(void *dta, const XML_Char *s, int len) } void -geo_rd_init(const char *fname) +geo_rd_init(const char *fname, const char *args) { fd = fopen(fname, "r"); if (fd == NULL) { @@ -165,7 +165,7 @@ geo_rd_deinit(void) } void -geo_wr_init(const char *fname) +geo_wr_init(const char *fname, const char *args) { ofd = fopen(fname, "w"); if (ofd == NULL) { diff --git a/gpsman.c b/gpsman.c index fbabe1ebc..fc15d5be6 100644 --- a/gpsman.c +++ b/gpsman.c @@ -25,7 +25,7 @@ static FILE *out_file; #define MYNAME "GPSMAN" static void -gpsman_rd_init(const char *fname) +gpsman_rd_init(const char *fname, const char *args) { in_file = fopen(fname, "r"); if (in_file == NULL) { @@ -40,7 +40,7 @@ gpsman_rd_deinit(void) } static void -gpsman_wr_init(const char *fname) +gpsman_wr_init(const char *fname, const char *args) { out_file = fopen(fname, "w"); if (out_file == NULL) { diff --git a/gpspilot.c b/gpspilot.c index 80fa6749b..26a750149 100644 --- a/gpspilot.c +++ b/gpspilot.c @@ -41,7 +41,7 @@ struct pdb *opdb; struct pdb_record *opdb_rec; static void -rd_init(const char *fname) +rd_init(const char *fname, const char *args) { file_in = fopen(fname, "rb"); if (file_in == NULL) { @@ -56,7 +56,7 @@ rd_deinit(void) } static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { file_out = fopen(fname, "wb"); out_fname = fname; diff --git a/gpsutil.c b/gpsutil.c index 19e1a06e6..6d0dc3e28 100644 --- a/gpsutil.c +++ b/gpsutil.c @@ -11,7 +11,7 @@ static FILE *file_out; #define MYNAME "GPSUTIL" static void -rd_init(const char *fname) +rd_init(const char *fname, const char *args) { file_in = fopen(fname, "r"); if (file_in == NULL) { @@ -26,7 +26,7 @@ rd_deinit(void) } static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { file_out = fopen(fname, "w"); if (file_out == NULL) { diff --git a/gpx.c b/gpx.c index 5f332fe99..44e20e0f6 100644 --- a/gpx.c +++ b/gpx.c @@ -222,7 +222,7 @@ gpx_cdata(void *dta, const XML_Char *s, int len) } void -gpx_rd_init(const char *fname) +gpx_rd_init(const char *fname, const char *args) { fd = fopen(fname, "r"); if (fd == NULL) { @@ -244,7 +244,7 @@ gpx_rd_deinit(void) } void -gpx_wr_init(const char *fname) +gpx_wr_init(const char *fname, const char *args) { ofd = fopen(fname, "w"); if (ofd == NULL) { diff --git a/holux.c b/holux.c index 04fa7c3a0..42b8b303f 100644 --- a/holux.c +++ b/holux.c @@ -37,7 +37,7 @@ static unsigned char *HxWFile; static char fOutname[256]; -static void rd_init(const char *fname) +static void rd_init(const char *fname, const char *args) { file_in = fopen(fname, "rb"); if (file_in == NULL) { @@ -56,7 +56,7 @@ static void rd_deinit(void) static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { HxWFile = xcalloc(GM100_WPO_FILE_SIZE, 1); diff --git a/magnav.c b/magnav.c index 93de8a7cc..730d3cfc2 100644 --- a/magnav.c +++ b/magnav.c @@ -56,7 +56,7 @@ struct pdb *opdb; struct pdb_record *opdb_rec; static void -rd_init(const char *fname) +rd_init(const char *fname, const char *args) { file_in = fopen(fname, "rb"); if (file_in == NULL) { @@ -71,7 +71,7 @@ rd_deinit(void) } static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { file_out = fopen(fname, "wb"); out_fname = fname; diff --git a/magproto.c b/magproto.c index b1d6b1efc..4d04a858f 100644 --- a/magproto.c +++ b/magproto.c @@ -27,7 +27,7 @@ #include "defs.h" #include "magellan.h" -#define BAUDRATE B4800 +int bitrate = 4800; #define MYNAME "MAGPROTO" #if __WIN32__ @@ -406,6 +406,19 @@ mag_readmsg(void) #include +DWORD +mkspeed(bitrate) +{ + switch (bitrate) { + case 1200: return CBR_1200; + case 2400: return CBR_2400; + case 4800: return CBR_4800; + case 9600: return CBR_9600; + case 19200: return CBR_19200; + default: return CBR_4800; + } +} + HANDLE comport; static @@ -430,7 +443,7 @@ terminit(const char *portname) } tio.DCBlength = sizeof(DCB); GetCommState (comport, &tio); - tio.BaudRate = CBR_4800; + tio.BaudRate = mkspeed(bitrate); tio.fBinary = TRUE; tio.fParity = TRUE; tio.fOutxCtsFlow = FALSE; @@ -510,6 +523,20 @@ termdeinit() #include +speed_t +mkspeed(unsigned br) +{ + switch (br) { + case 1200: return B1200; + case 2400: return B2400; + case 4800: return B4800; + case 9600: return B9600; + case 19200: return B19200; + default: return B4800; + } +} + + static struct termios orig_tio; static void terminit(const char *portname) @@ -547,8 +574,8 @@ terminit(const char *portname) new_tio.c_cc[VTIME] = 10; new_tio.c_cc[VMIN] = 0; - cfsetospeed(&new_tio, BAUDRATE); - cfsetispeed(&new_tio, BAUDRATE); + cfsetospeed(&new_tio, mkspeed(bitrate)); + cfsetispeed(&new_tio, mkspeed(bitrate)); tcsetattr(magfd, TCSAFLUSH, &new_tio); } @@ -575,9 +602,14 @@ termwrite(char *obuf, int size) static void -mag_rd_init(const char *portname) +mag_rd_init(const char *portname, const char *args) { time_t now, later; + char * bs = get_option(args, "baud"); + + if (bs) { + bitrate=atoi(bs); + } terminit(portname); @@ -603,7 +635,7 @@ mag_rd_init(const char *portname) } static void -mag_wr_init(const char *portname) +mag_wr_init(const char *portname, const char *args) { struct stat sbuf; @@ -622,7 +654,7 @@ mag_wr_init(const char *portname) * reading and writing, so we let rd_init do the dirty work. */ fclose(magfile_out); - mag_rd_init(portname); + mag_rd_init(portname, args); } } diff --git a/main.c b/main.c index daa37bde5..10f764efe 100644 --- a/main.c +++ b/main.c @@ -41,6 +41,8 @@ main(int argc, char *argv[]) ff_vecs_t *ovecs = NULL; char *fname = NULL; char *ofname = NULL; + char *ivec_opts = NULL; + char *ovec_opts = NULL; waypt_init(); route_init(); @@ -65,11 +67,11 @@ main(int argc, char *argv[]) switch (c) { case 'i': - ivecs = find_vec(optarg); + ivecs = find_vec(optarg, &ivec_opts); argn++; break; case 'o': - ovecs = find_vec(optarg); + ovecs = find_vec(optarg, &ovec_opts); argn++; break; case 'f': @@ -78,7 +80,7 @@ main(int argc, char *argv[]) if (ivecs == NULL) { fatal ("No valid input type specified"); } - ivecs->rd_init(fname); + ivecs->rd_init(fname, ivec_opts); ivecs->read(); ivecs->rd_deinit(); break; @@ -86,7 +88,7 @@ main(int argc, char *argv[]) ofname = optarg; argn++; if (ovecs) { - ovecs->wr_init(ofname); + ovecs->wr_init(ofname, ovec_opts); ovecs->write(); ovecs->wr_deinit(); } diff --git a/mapsend.c b/mapsend.c index 01df1b072..3fdbe8224 100644 --- a/mapsend.c +++ b/mapsend.c @@ -48,7 +48,7 @@ test_endianness(void) } static void -mapsend_rd_init(const char *fname) +mapsend_rd_init(const char *fname, const char *args) { mapsend_file_in = fopen(fname, "rb"); if (mapsend_file_in == NULL) { @@ -164,7 +164,7 @@ my_fwrite4(void *ptr, FILE *stream) } static void -mapsend_wr_init(const char *fname) +mapsend_wr_init(const char *fname, const char *args) { mapsend_file_out = fopen(fname, "wb"); if (mapsend_file_out == NULL) { diff --git a/mapsource.c b/mapsource.c index 3db7d2d1e..492238351 100644 --- a/mapsource.c +++ b/mapsource.c @@ -30,7 +30,7 @@ static FILE *mapsource_file_out; #define MYNAME "MAPSOURCE" static void -mapsource_rd_init(const char *fname) +mapsource_rd_init(const char *fname, const char *args) { mapsource_file_in = fopen(fname, "r"); if (mapsource_file_in == NULL) { @@ -45,7 +45,7 @@ mapsource_rd_deinit(void) } static void -mapsource_wr_init(const char *fname) +mapsource_wr_init(const char *fname, const char *args) { mapsource_file_out = fopen(fname, "w"); if (mapsource_file_out == NULL) { diff --git a/mxf.c b/mxf.c index e2e25e148..db20ccb13 100644 --- a/mxf.c +++ b/mxf.c @@ -38,7 +38,7 @@ static FILE *file_in; static FILE *file_out; static void -rd_init(const char *fname) +rd_init(const char *fname, const char *args) { file_in = fopen(fname, "r"); if (file_in == NULL) { @@ -53,7 +53,7 @@ rd_deinit(void) } static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { file_out = fopen(fname, "w"); if (file_out == NULL) { diff --git a/ozi.c b/ozi.c index 3ef4ac262..b04d05dac 100644 --- a/ozi.c +++ b/ozi.c @@ -36,7 +36,7 @@ static FILE *file_in; static FILE *file_out; static void -rd_init(const char *fname) +rd_init(const char *fname, const char *args) { file_in = fopen(fname, "r"); if (file_in == NULL) { @@ -51,7 +51,7 @@ rd_deinit(void) } static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { file_out = fopen(fname, "w"); if (file_out == NULL) { diff --git a/pcx.c b/pcx.c index 039e1b2ef..cb81973e4 100644 --- a/pcx.c +++ b/pcx.c @@ -29,7 +29,7 @@ static FILE *file_out; static void -rd_init(const char *fname) +rd_init(const char *fname, const char *args) { file_in = fopen(fname, "r"); if (file_in == NULL) { @@ -44,7 +44,7 @@ rd_deinit(void) } static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { file_out = fopen(fname, "w"); if (file_out == NULL) { diff --git a/psp.c b/psp.c index ea2e085ba..3e8609266 100644 --- a/psp.c +++ b/psp.c @@ -241,7 +241,7 @@ buffer_washer(char * buff, int buffer_len) } static void -psp_rd_init(const char *fname) +psp_rd_init(const char *fname, const char *args) { psp_file_in = fopen(fname, "rb"); if (psp_file_in == NULL) { @@ -256,7 +256,7 @@ psp_rd_deinit(void) } static void -psp_wr_init(const char *fname) +psp_wr_init(const char *fname, const char *args) { psp_file_out = fopen(fname, "wb"); if (psp_file_out == NULL) { diff --git a/tiger.c b/tiger.c index faf5efb0d..d56c1832f 100644 --- a/tiger.c +++ b/tiger.c @@ -28,7 +28,7 @@ static FILE *file_out; #define MYNAME "GPSUTIL" static void -rd_init(const char *fname) +rd_init(const char *fname, const char *args) { file_in = fopen(fname, "r"); if (file_in == NULL) { @@ -43,7 +43,7 @@ rd_deinit(void) } static void -wr_init(const char *fname) +wr_init(const char *fname, const char *args) { file_out = fopen(fname, "w"); if (file_out == NULL) { diff --git a/tpg.c b/tpg.c index d7dd62c11..dc005a383 100644 --- a/tpg.c +++ b/tpg.c @@ -128,7 +128,7 @@ valid_tpg_header(char * header, int len) } static void -tpg_rd_init(const char *fname) +tpg_rd_init(const char *fname, const char *args) { tpg_file_in = fopen(fname, "rb"); if (tpg_file_in == NULL) { @@ -143,7 +143,7 @@ tpg_rd_deinit(void) } static void -tpg_wr_init(const char *fname) +tpg_wr_init(const char *fname, const char *args) { tpg_file_out = fopen(fname, "wb"); if (tpg_file_out == NULL) { diff --git a/vecs.c b/vecs.c index 25d161cd2..9f7bfd6f9 100644 --- a/vecs.c +++ b/vecs.c @@ -166,18 +166,66 @@ vecs_t vec_list[] = { }; ff_vecs_t * -find_vec(char *const vecname) +find_vec(char *const vecname, char **opts) { vecs_t *vec = vec_list; + char *v = xstrdup(vecname); + char *svecname = strtok(v, ","); + while (vec->vec) { - if (strcmp(vecname, vec->name) == 0) { + if (strcmp(svecname, vec->name) == 0) { + char * res = strchr(vecname, ','); + if (res) + *opts = strchr(vecname, ',')+1; + else + *opts = NULL; + free(v); return vec->vec; } vec++; } + free(v); return NULL; } +/* + * Find and return a specific argument in an arg list. + * Modelled approximately after getenv. + */ +char * +get_option(const char *iarglist, const char *argname) +{ + size_t arglen = strlen(argname); + char *arglist; + char *rval = NULL; + char *arg; + char *argp; + + if (!iarglist) { + return NULL; + } + + arglen = strlen(argname); + arglist = xstrdup(iarglist); + + for (arg = arglist; argp = strtok(arg, ","); arg = NULL) { + if (0 == strncmp(argp, argname, arglen)) { + /* + * If we have something of the form "foo=bar" + * return "bar". Otherwise, we assume we have + * simply "foo" so we return that. + */ + if (argp[arglen] == '=') + rval = argp + arglen + 1; + else + rval = argp; + break; + } + } + free(arglist); + return rval; +} + void disp_vecs(void) { -- 2.30.2